﻿using System.IO;
using Tesla.Servicios;
using Tesla.Proveedores;
using Tesla.Validador;

namespace Rendiciones.Logica.Servicios
{
    public interface IServ
    {
        IServUsuario Usuarios { get; }
        IServProyecto Proyectos { get; }
        IServDocumentos Documentos { get; }
        IServRoles Roles { get; }
        IServProveedor Proveedores { get; }
        IServTotales Totales { get; }
        IServEstados Estados { get; }
        IServBancos Bancos { get; }
        IServRendiciones Rendiciones { get; }
        IServWorkFlow WorkFlows { get; }
        IServExcel Excel { get; }

        IServGasto Gastos { get; }
    }

    public class Serv : IServ
    {
        private readonly IProveedor _proveedor;
        private readonly IValidador _validador;
        private readonly IServicioLog _log;
        public Serv(string connectionString, string prefijo, DirectoryInfo rutaLog)
        {
            _log = new ServicioLog(rutaLog);
            _validador = new Validador();
            _proveedor = new ProveedorSql(_log, connectionString, prefijo);
        }

        private IServUsuario _cacheUsuarios;
        private IServProyecto _cacheProyectos;
        private IServDocumentos _cacheDocumentos;
        private IServRoles _cacheRoles;
        private IServProveedor _cacheProveedores;
        private IServTotales _cacheTotales;
        private IServEstados _cacheEstados;
        private IServBancos _cacheBancos;
        private IServRendiciones _cacheRendiciones;
        private IServWorkFlow _cacheWorkFlows;
        private IServExcel _cacheExcel;
        
        private IServGasto _cacheGastos;

        public IServUsuario Usuarios { get { _cacheUsuarios = _cacheUsuarios ?? new ServUsuario(_proveedor, _validador, Roles); return _cacheUsuarios; } }
        public IServProyecto Proyectos { get { _cacheProyectos = _cacheProyectos ?? new ServProyecto(_proveedor, _validador); return _cacheProyectos; } }
        public IServDocumentos Documentos { get { _cacheDocumentos = _cacheDocumentos ?? new ServDocumentos(_proveedor, _validador); return _cacheDocumentos; } }
        public IServRoles Roles { get { _cacheRoles = _cacheRoles ?? new ServRoles(_proveedor, _validador); return _cacheRoles; } }
        public IServProveedor Proveedores { get { _cacheProveedores = _cacheProveedores ?? new ServProveedor(_proveedor, _validador); return _cacheProveedores; } }
        public IServTotales Totales { get { _cacheTotales = _cacheTotales ?? new ServTotales(_proveedor, _validador); return _cacheTotales; } }
        public IServEstados Estados { get { _cacheEstados = _cacheEstados ?? new ServEstados(_proveedor); return _cacheEstados; } }
        public IServBancos Bancos { get { _cacheBancos = _cacheBancos ?? new ServBancos(_proveedor); return _cacheBancos; } }
        public IServRendiciones Rendiciones { get { _cacheRendiciones = _cacheRendiciones ?? new ServRendiciones(_proveedor); return _cacheRendiciones; } }
        public IServWorkFlow WorkFlows { get { _cacheWorkFlows = _cacheWorkFlows ?? new ServWorkFlow(_proveedor); return _cacheWorkFlows; } }
        public IServExcel Excel { get { _cacheExcel = _cacheExcel ?? new ServExcel(); return _cacheExcel; } }

        public IServGasto Gastos { get { _cacheGastos = _cacheGastos ?? new ServGasto(_proveedor, _validador); return _cacheGastos; } }
        
    }
}